package com;

import com.handlers.BeanConstants;
import java.beans.PropertyDescriptor;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Arrays;

public class MiniGenerousBeanProcessor extends MiniBeanProcessor{
    public MiniGenerousBeanProcessor() {
        super();
    }

    @Override
    protected int[] mapColumnsToProperties(final ResultSetMetaData rsmd, final PropertyDescriptor[] props) throws SQLException {
        //获取结果集元数据 也就是要查询的列数
        final int clos = rsmd.getColumnCount();
        //实体类中的属性
        final int[] columnToProperty = new int[clos + 1];
        //首先往数组中所有填充 -1
        Arrays.fill(columnToProperty, BeanConstants.PROPERTY_NOT_FOUND);

        for (int i = 1; i <= clos; i++) {
            //获取列名--》有多少列就循环多少次
            String columnName = rsmd.getColumnName(i);
            if (null == columnName || 0 == columnName.length()) {
                columnName = rsmd.getColumnName(i);
            }

            String name = toCameCase2(columnName);

            //从实体类的所有属性中，找出同名的bean属性，默认bean属性名=列名
            for (int j = 0; j < props.length; j++) {
                //获取属性描述--》依次循环
                final String propName = props[j].getName();

                if(columnName.equalsIgnoreCase(propName) ){
                    columnToProperty[i] = j;
                    break;
                    //停止内部循环，不要继续遍历，继续外层if循环
                }
            }
        }
        return columnToProperty;
    }


    public static String toCameCase(String str){
        // 字符串缓冲区
        StringBuffer sbf = new StringBuffer();
        // 如果字符串包含 下划线
        if (str.contains("_"))
        {
            // 按下划线来切割字符串为数组
            String[] split = str.split("_");
            // 循环数组操作其中的字符串
            for (int i = 0, index = split.length; i < index; i++)
            {
                // 递归调用本方法
                String upperTable = toCameCase(split[i]);
                // 添加到字符串缓冲区
                sbf.append(upperTable);
            }
        } else
        {// 字符串不包含下划线
            // 转换成字符数组
            char[] ch = str.toCharArray();
            // 判断首字母是否是字母
            if (ch[0] >= 'a' && ch[0] <= 'z')
            {
                // 利用ASCII码实现大写
                ch[0] = (char) (ch[0] - 32);
            }
            // 添加进字符串缓存区
            sbf.append(ch);
        }
        // 返回
        return sbf.toString();
    }

    public static String toCameCase2(String str){
        if(str == null){
            return null;
        }

        //分成数组
        char[] charArray = str.toCharArray();
        //判断上次循环的字符是否是“_”
        boolean underlineBefore = false;
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < charArray.length; i++) {
            if(charArray[i] == 95){
                underlineBefore = true;
            }else if(underlineBefore){
                //如果为true 代表上次的字符是“_”,当前字符需要转成大写
                buffer.append(charArray[i] -= 32);
                underlineBefore = false;
            }else {
                //不是"_"后的字符就直接追加
                buffer.append(charArray[i]);
            }
        }
        return buffer.toString();
    }


    public static void main(String[] args) {
        String name = toCameCase("user_name");
        System.out.println(name);
    }
}
